<?php
	//debug.class.php调试类
	class Debug {
		//包含文件错误
		static $includefile=array();
		//其他错误
		static $info=array();
		//sql错误
		static $sqls=array();
		static $timeStart;
		static $timeStop;
		static $memoryStart;
		static $memoryStop;
		static $msg = array(
       			 E_WARNING=>'运行时警告',
       			 E_NOTICE=>'运行时提醒',
        		 E_STRICT=>'编码标准化警告',
        		 E_USER_ERROR=>'自定义错误',
        		 E_USER_WARNING=>'自定义警告',
        		 E_USER_NOTICE=>'自定义提醒',
        		 'Unkown '=>'未知错误'
		 );
		
		//静态方法,在脚本开始处调用获取脚本开始运行时间的微秒值
		static function timeStart(){
			self::$timeStart = microtime(true);
		}
		
		//静态方法,在脚本结束处调用获取脚本结束时间的微秒值
		static function timeStop(){
			self::$timeStop= microtime(true);
		}
		
		//返回脚本运行耗时
		static function timeSpent(){
			//4舍5入保留4位
			return round((self::$timeStop - self::$timeStart) , 4);
		}
		
		//静态方法,在脚本开始处调用获取脚本使用内存
		static function memoryStart(){
			self::$memoryStart = memory_get_usage(true);
		}
		
		//静态方法,在脚本结束处调用获取脚本使用内存
		static function memoryStop(){
			self::$memoryStop= memory_get_usage(true);
		}
		
		//返回脚本运行使用内存
		static function memorySpent(){
			//4舍5入保留4位,单位为MB
			return round((self::$memoryStop - self::$memoryStart)/1000000 , 4);
		}
		
		//静态方法,捕获系统错误和异常
		//@param	int	$errno	错误号
		//@param	string	$errstr	错误消息
		//@param	string	$errfile	错误出现的文件
		//@param	string	$errline	错误消息所在行
		static function Catcher($errno, $errstr, $errfile, $errline){
			if(!isset(self::$msg[$errno]))
				$errno='Unkown';
			
			if($errno==E_NOTICE || $errno==E_USER_NOTICE)
				$color="#000088";
			else
				$color="red";

	   		$mess='<font color='.$color.'>';
	   		$mess.='<b>'.self::$msg[$errno]."</b>[在文件 {$errfile} 中,第 {$errline} 行]:";
	   		$mess.=$errstr;
	   		$mess.='</font>';
	  		self::addMsg($mess);
		}
		
		//静态方法,添加调试消息
		//@param	string	$msg	调试消息字符串
		//@param	int	$type	消息的类型
		static function addmsg($msg,$type=0) {
			if(defined("DEBUG") && DEBUG==1){
				switch($type){
					case 0:
						self::$info[]=$msg;
						break;
					case 1:
						self::$includefile[]=$msg;
						break;
					case 2:
						self::$sqls[]=$msg;
						break;
				}
			}
		}
		
		//输出调试消息
		static function message(){
			echo '<div style="float:left;clear:both;text-align:left;font-size:11px;color:#888;width:95%;margin:10px;padding:10px;background:#F5F5F5;border:1px dotted #778855;z-index:100">';
			echo '<div style="float:left;width:100%;"><span style="float:left;width:200px;"><b>运行信息</b>( <font color="red">'.self::timeSpent().' </font>秒, <font color="red">'.self::memorySpent().' </font>MB):</span><span onclick="this.parentNode.parentNode.style.display=\'none\'" style="cursor:pointer;float:right;width:35px;background:#500;border:1px solid #555;color:white">关闭X</span></div><br>';
			echo '<ul style="margin:0px;padding:0 10px 0 10px;list-style:none">';
			if(count(self::$includefile) > 0){
				echo '［自动包含］';
				foreach(self::$includefile as $file){
					echo '<li>&nbsp;&nbsp;&nbsp;&nbsp;'.$file.'</li>';
				}		
			}
			if(count(self::$info) > 0 ){
				echo '<br>［系统信息］';
				foreach(self::$info as $info){
					echo '<li>&nbsp;&nbsp;&nbsp;&nbsp;'.$info.'</li>';
				}
			}

			if(count(self::$sqls) > 0) {
				echo '<br>［SQL语句］';
				foreach(self::$sqls as $sql){
					echo '<li>&nbsp;&nbsp;&nbsp;&nbsp;'.$sql.'</li>';
				}
			}
			echo '</ul>';
			echo '</div>';	
		}
	}